"""
Grafisches Hauptmenue des Spiels

@author: Max
"""

import os
import sys

import pygame

import Colors  # @UnresolvedImport
import Level


class MainMenu(pygame.Surface):
    """
    Dies ist das Hauptmenue des Spiels. 
    Alle Screens erben von pygame.Surface, um eine neue Oberflaeche zu erzeugen
    und von 
    InputHandler, um alle Input-Ereignisse abzufangen und ggf. zu verarbeiten.
    """
    def __init__(self, res, log, rs):
        """
        Das Hauptmenue erwartet die Groesse der Oberflaeche, die gezeichnet werden soll.
        
        @param res: Groesse der Oberflaeche
        """
        pygame.Surface.__init__(self, res)
        self.bgColor = Colors.WHITE
        self.imgBG = pygame.image.load(os.path.join("..", "Resources", "Assets", "bg.jpg"))
        self.Log = log
        self.res = res
        self.RenderScreen = rs
        
        self.dictButton = {}
        self.iButtonY = self.res[1] * 0.1
        
        self.setupMenu()
        
        
    def handleInput(self):
        """
        Hier wird zunaechst der Input von der Elternklasse verarbeitet. 
        Wurde keine Taste gedrueckt, die global vergeben ist uebernimmt die Klasse selbst 
        die Input-Ueberpruefung und wendet etwaige Veraenderungen an.
        """
        for event in pygame.event.get():
                if event.type == pygame.MOUSEBUTTONDOWN:
                    if event.button == 1:
                        for btn in self.dictButton:
                            if self.dictButton[btn].collidepoint(event.pos):
                                pygame.draw.rect(self, Colors.GREEN, self.dictButton[btn])
                                self.setButtonText(btn)
                                
                if event.type == pygame.MOUSEBUTTONUP:
                    self.drawButtons()
                    for btn in self.dictButton:
                            if self.dictButton[btn].collidepoint(event.pos):
                                self.Log.printToLog("MainMenu: %s-Button gedrueckt!" % btn)
                                self.handleButtons(btn)

        return True       
    
    def handleButtons(self, name):
        """
        Hier wird entschieden, was passiert, wenn ein Button gedrueckt wurde!
        
        @param name: Name des Buttons, der gedrueckt wurde.
        @type name: pygame.rect.Rect
        """
        if name == "Beenden":
            self.Log.printToLog("MainMenu: Spiel wird beendet!")
            sys.exit(0)
        elif name == "Neues Spiel":
            self.Log.printToLog("MainMenu: Szenenwechsel zu Level")
            self.RenderScreen.currentScene = Level.Level(self.res, self.Log, self.RenderScreen)
            self.RenderScreen.currentScene.loadLevel("level1")
    
    def setupMenu(self):
        """
        Hier wird das Menue gebaut
        """
        self.fill(Colors.BLACK)   
        self.blit(self.imgBG, (0, 0))
        
        self.createButton("Neues Spiel")
        self.createButton("Beenden")
        
        self.drawButtons()
        
    def createButton(self, name):
        """
        Erstellt ein Button mit uebergebenem Namen
        @param name: Text der auf dem Button steht
        @type name: String
        """
        self.dictButton[name] = pygame.rect.Rect(self.res[0] * 0.7, self.iButtonY, 150, 50)
        self.iButtonY = self.dictButton[name].bottomleft[1] + 20
    
    def drawButtons(self):
        """
        Diese Buttons werden hier gezeichnet. Das ist der Standard-Zustand, ohne Klick oder Hover-Effekt
        """
        for btn in self.dictButton:
            pygame.draw.rect(self, Colors.RED, self.dictButton[btn])
            self.setButtonText(btn)
    
    def setButtonText(self, btn):
        """
        Hier wird der Text fuer den Button eingefuegt.
        @param btn: Button, dessen Text gesetzt werden soll.
        @type btn: pygame.rect.Rect
        """
        
        font = pygame.font.SysFont("Arial", 25)
        posx = self.dictButton[btn].centerx - font.size(btn)[0] / 2
        posy = self.dictButton[btn].centery - font.get_height() / 2
        pos = (posx, posy)
        self.blit(font.render(btn, True, Colors.WHITE), pos)
    
    def update(self, td):
        """
        Bei jedem Durchlauf der GameLoop wird die Eingabe ueberprueft und 
        die Oberflaeche neu gezeichnet.
        """
        self.handleButtons("Neues Spiel")
        running = self.handleInput()
        return running
    
    def render(self):
        self.drawButtons()
